package com.hspedu.customgeneric;


/**
 * @Author Stringzhua
 * @Date 2024/3/14 13:13
 * description:自定义泛型类
 */
@SuppressWarnings("all")
public class CustomGeneric_ {
    public static void main(String[] args) {
        //T=Double,R=String,M=Integer
        Tiger<Double, String, Integer> g = new Tiger<>("john");
        /*
        g.setT(10.9);//ok
        g.setT("yy");
        System.out.println("g = " + g);

        Tiger g2 = new Tiger("john~~");
        g2.setT("yy");
        System.out.println("g2 = " + g2);
        */
        g.setT(10.9);//ok
//        g.setT("yy");//T是double类型,类型不对
        System.out.println("g = " + g);

        Tiger g2 = new Tiger("john~~");//ok
        //T,R,M默认是Object()类型
        g2.setT("yy");//ok,
        // T=Object "yy"=String String是Object类型的子类
        System.out.println("g2 = " + g2);
    }
}


//解读
//1.Tiger后面泛型,所以我们就把Tiger称为自定义泛型类
//2.T,R,M 泛型标识符一般是单个大写字母
//3.泛型的标识符可以有 多个
//4.普通成员可以使用泛型(属性,方法)
//5.在使用泛型的数组，不能初始化
//6.静态方法中不能使用类的泛型
class Tiger<T, R, M> {
    String name;
    R r;//属性使用到泛型
    M m;
    T t;

    //因为数组在new 不能确定T的类型,就无法在内存开空间
//    T[] ts=new T[8];//类型参数"T"不能直接实例化
//    Type parameter 'T' cannot be instantiated directly
    public Tiger(R r, M m, T t) {//构造器使用泛型
        this.r = r;
        this.m = m;
        this.t = t;
    }

    public Tiger(String name) {
        this.name = name;
    }

    public Tiger(String name, R r, M m, T t) {//构造器使用泛型
        this.name = name;
        this.r = r;
        this.m = m;
        this.t = t;
    }
    //静态方法中不能使用类的泛型
    //因为静态是和类相关的,在类加载时,对象还没有创建
    //所以,如果静态方法和静态属性使用了泛型,JVM就无法完成初始化
//    static R r2;
//    public static void m1(M m){
//        //'Tiger.this' cannot be referenced from a static context
//    }
    //方法使用泛型

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public R getR() {    //返回类型可以使用泛型
        return r;
    }

    public void setR(R r) {    //方法使用泛型
        this.r = r;
    }

    public M getM() {
        return m;
    }

    public void setM(M m) {
        this.m = m;
    }

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }

    @Override
    public String toString() {
        return "Tiger{" +
                "name='" + name + '\'' +
                ", r=" + r +
                ", m=" + m +
                ", t=" + t +
                '}';
    }
}

